package com.thf.util;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Upload {
    public static String file(MultipartFile ImgFile , HttpServletRequest req) {
        // 获得磁盘文件条目工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 如果没以下两行设置的话，上传大的 文件 会占用 很多内存，
        // 设置暂时存放的 存储室 , 这个存储室，可以和 最终存储文件 的目录不同
        /**
         * 原理 它是先存到 暂时存储室，然后在真正写到 对应目录的硬盘上， 按理来说 当上传一个文件时，其实是上传了两份，第一个是以
         * .tem 格式的 然后再将其真正写到 对应目录的硬盘上
         */
//        factory.setRepository(new File(TEMP_FOLDER));
        // 设置 缓存的大小，当上传文件的容量超过该缓存时，直接放到 暂时存储室
        factory.setSizeThreshold(1024 * 1024);

        // 高水平的API文件上传处理,解析文件
        ServletFileUpload upload = new ServletFileUpload(factory);

        // 请自行组织代码

        String imgName = ImgFile.getOriginalFilename();
//        System.out.println("++++=============>"+imgName);
        // 获取上传的文件
            // 保存后的文件名  1234564564----a.jpg
            String fileName = System.currentTimeMillis() + "---" + imgName;
            String temp = req.getServletContext().getRealPath("/");
            String path = temp.split("target")[0] + "/src/main/java/com/thf";
            String derectory = "/loadimg/";
            String str = null ;
//            String path = "D:\\wanxi\\step-4\\huarui04\\web\\img";
            // 真正写到磁盘上
//            File aa = new File(path, derectory);
//            文件夹不存在则创建文件夹
            File aa = createDerectory(path + derectory);
            try {
                File tempFile = new File(aa, fileName);
                ImgFile.transferTo(tempFile);
                File newFile = createDerectory(temp + derectory);
                createDerectory(temp + derectory);
                copyFile(tempFile, new File(newFile, fileName));
                str = derectory + fileName ;
            } catch (Exception e) {
                e.printStackTrace();
            }
        return str ;
    }


    //定义方法实现文件复制,一次复制一个字节数组,自动关闭流
    private static void copyFile(File file, File newFile) {
        try (       //在try资源块中建立流通道
                    FileInputStream fis = new FileInputStream(file);
                    FileOutputStream fos = new FileOutputStream(newFile)
        ){
            byte[] bytes = new byte[1024*8];

            int len = fis.read(bytes);
            while (len != -1){
                //把bytes数组中读到的前len个字节保存到目标文件中
                fos.write(bytes, 0, len);
                //继续从源文件中读取字节存储到字节数组中
                len = fis.read(bytes);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 创建文件目录
     */
    private static File createDerectory(String path) {
        File newFileDerectory = new File(path);
        if (!newFileDerectory.exists()) {
            newFileDerectory.mkdirs();
        }
        return newFileDerectory;
    }
}
